package com.ljx.designMode.observerMode;



import com.ljx.designMode.observerMode.Teacher;

import java.util.ArrayList;
import java.util.List;

/**
 * @author LJX
 * @Description: TODO
 * @Date: 2022/11/9 17:23
 * @Version 1.0
 */

/**
 * 观察者（observer）模式的定义：指多个对象间存在一对多的依赖关系，当一个对象的状态
 * 发生改变，所有依赖于它的对象都得到通知并被自动更新，这种模式有时称作发布-订阅模式
 * 模型-视图模式 他是对象行为型模式
 */
public class ObserverModeTest01 {

	public static void main(String[] args) {
		YoungStudy youngStudy = new YoungStudy();
		Student student = new Student();
		Teacher teacher = new Teacher();
		youngStudy.attenntion(student);
		youngStudy.attenntion(teacher);
		youngStudy.setMessage("来把大学习");
		youngStudy.pushMsg();
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~``");
		youngStudy.cancleAttention(teacher);
		youngStudy.pushMsg();
	}
}

/**
 * 抽象主题（Subject）角色，也叫做抽象目标类。他提供了一个用于保存观察者对象的聚集类
 * 和增加删除等观察者对象的方法，以及通知所有观察者的抽象方法，
 */
interface Gzh{
	void attenntion(Audience audience);

	void cancleAttention(Audience audience);

	void pushMsg();

}

/**
 * 具体主题（Concreat Subject）：角色：也叫做具体目标类，它实现抽象目标中的通知方法等
 * 当具体主题内部状态发生改变时，通知所有注册过观察者对象
 */
class YoungStudy implements Gzh{
	private String message;

	public void setMessage(String message) {
		this.message = message;
	}

	private  List<Audience> list =new ArrayList<Audience>();

	@Override
	public void attenntion(Audience audience) {
		list.add(audience);
	}

	@Override
	public void cancleAttention(Audience audience) {
		list.remove(audience);
	}

	@Override
	public void pushMsg() {
		for (Audience audience1 : list) {
			audience1.updateMessage(message);
		}
	}
}

/**
 * 抽象观察者（Observer）角色：它是一个抽象类或者接口，它包含了一个更新自己抽象方法
 * 当接受到具体主题的更改时即时被调用以达到通知作用
 */
interface Audience{
	void updateMessage(String message);
}

class Student implements Audience{
	@Override
	public void updateMessage(String message) {
		System.out.println("学生接受到更新"+message);
	}
}

/**
 * 具体观察者（Concrete Observer)角色：实现抽象观察者中定义的抽象方法，以便在得到
 * 目标的更改通知时，更新自身的状态
 */
class Teacher implements Audience{
	@Override
	public void updateMessage(String message) {
		System.out.println("老师接受到更新"+message);
	}
}